home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / lib / pmake / boot.mk < prev    next >
Text File  |  1992-05-18  |  10KB  |  373 lines

  1. #
  2. # Makefile for boot programs in general.
  3. # This is included by Makefile.boot after $(TM).md/md.mk is included
  4. # The following variables should be defined already:
  5. #    NAME        program to be created
  6. #    OBJS        object files from which to create it
  7. #    CLEANOBJS    object files to be removed as part of "make clean"
  8. #            (need not just be object files)
  9. #    SRCS        sources for dependency generation
  10. #    TM        target machine type for object files, etc.
  11. #    TM        target machine type for object files etc.
  12. #    MACHINES    list of all target machines currently available
  13. #    INSTALLDIR    place to install program
  14. #    LINKSTART    address at which the boot program should be linked.
  15. #
  16. # Optional variables that may be defined by the invoker:
  17. #    XAFLAGS        additional flags to pass to assembler
  18. #    XCFLAGS        additional flags to pass to linker
  19. #    DEPFLAGS    additional flags to pass to makedepend
  20. #    no_targets    if defined, this file will not define all of the
  21. #            basic targets (make, make clean, etc.)
  22. #    use_version    if defined, then this file will set things up
  23. #            to include a version number that is automatically
  24. #            incremented
  25. #
  26. # $Header: /sprite/lib/pmake/RCS/boot.mk,v 1.21 92/04/13 18:33:50 elm Exp $
  27. #
  28.  
  29. #
  30. # The variables below should be defined in md.mk, but they are given
  31. # default values just in case md.mk doesn't exist yet.
  32. #
  33. HDRS        ?=
  34. OBJS        ?=
  35. SRCS        ?=
  36.  
  37. #
  38. # First define search paths for libraries, include files, lint libraries,
  39. # and even sources.
  40. #
  41. .PATH.h        :
  42. .PATH.h        : $(TM).md /sprite/lib/include /sprite/lib/include/$(TM).md
  43. .PATH.ln    : /sprite/lib/lint
  44. .PATH.c        :
  45. .PATH.c        : $(TM).md
  46. .PATH.s        :
  47. .PATH.s        : $(TM).md
  48.  
  49. #
  50. # Important directories. 
  51. #
  52. MISCLIBDIR    = /sprite/lib/misc
  53. BINDIR        = /sprite/cmds.$(MACHINE)
  54.  
  55. #
  56. # System programs -- assign conditionally so they may be redefined in
  57. # including makefile
  58. #
  59. AS        ?= $(BINDIR)/as
  60. CC        ?= $(BINDIR)/cc
  61. CHGRP        ?= $(BINDIR)/chgrp
  62. CHMOD        ?= $(BINDIR)/chmod
  63. CHOWN        ?= $(BINDIR)/chown
  64. CP        ?= $(BINDIR)/cp
  65. CPP        ?= $(BINDIR)/cpp -traditional -$
  66. CTAGS        ?= $(BINDIR)/ctags
  67. ECHO        ?= $(BINDIR)/echo
  68. LD        ?= $(BINDIR)/ld
  69. LINT        ?= $(BINDIR)/lint
  70. MAKEDEPEND    ?= $(BINDIR)/makedepend
  71. MKVERSION    ?= $(BINDIR)/mkversion
  72. MV        ?= $(BINDIR)/mv
  73. RM        ?= $(BINDIR)/rm
  74. SED        ?= $(BINDIR)/sed
  75. TEST            ?= $(BINDIR)/test
  76. TOUCH        ?= $(BINDIR)/touch
  77. UPDATE        ?= $(BINDIR)/update
  78.  
  79. INSTALL_PROG    ?= /sprite/admin.$(MACHINE)/makeboot
  80. #
  81. # Several variables (such as where to install) are set based on the
  82. # TYPE variable.  Of course, any of these variables can be overridden
  83. # by explicit assignments.
  84. #
  85. TYPE        ?= boot
  86. INSTALLDIR    ?= /sprite/boot
  87. TMINSTALLDIR    ?= /sprite/boot/$(TM).md
  88.  
  89. #
  90. # Figure out what stuff we'll pass to sub-makes.
  91. #
  92. PASSVARS    = 'INSTALLDIR=$(INSTALLDIR)' 'TM=$(TM)' $(.MAKEFLAGS)
  93. #ifdef        XCFLAGS
  94. PASSVARS    += 'XCFLAGS=$(XCFLAGS)'
  95. #endif
  96. #ifdef        XAFLAGS
  97. PASSVARS    += 'XAFLAGS=$(XAFLAGS)'
  98. #endif
  99. #ifdef        NOBACKUP
  100. PASSVARS    += 'NOBACKUP=$(NOBACKUP)'
  101. #endif
  102. #ifdef        BACKUPAGE
  103. PASSVARS    += 'BACKUPAGE=$(BACKUPAGE)'
  104. #endif
  105.  
  106. #
  107. # Flags. These are ones that are needed by *all* boot programs. Any other
  108. # ones should be added with the += operator in the local.mk file.
  109. # The FLAGS variables are defined with the += operator in case this file
  110. # is included after the main makefile has already defined them...
  111.  
  112. #include     <tm.mk>
  113.  
  114. XCFLAGS        ?=
  115. XAFLAGS        ?=
  116. LINTFLAGS    ?= -m$(TM)
  117. INSTALLFLAGS    ?=
  118. LDFLAGS        += -L/sprite/lib/${TM}.md
  119. AFLAGS        += $(TMAFLAGS) $(XAFLAGS)
  120. CFLAGS        += $(TMCFLAGS) $(XCFLAGS) -I.
  121.  
  122. #if !empty(TM:Mds3100) || !empty(TM:Mds5000)
  123. CFLAGS        += -I/sprite/lib/include -I/sprite/lib/include/$(TM).md
  124. AFLAGS        += $(.INCLUDES)
  125. #endif
  126.  
  127. CFLAGS        += -I../../kernel/Include/$(TM).md -I../../kernel/Include
  128.  
  129. # KERNELSTART is the absolute address at which the kernel expects to have
  130. # its code loaded.
  131. # LINKSTART is where the boot program is loaded into memory.  It has
  132. # to be loaded high enough so that the kernel image it loads does
  133. # not overwrite the boot program.  (If it does, it generally happens
  134. # as it zeros out the bss segment.  The PROM will abort with Exception 10
  135. # or something immediately after the boot program prints out the kernel sizes.)
  136. # BOOTDIR is the directory in which the boot things live.
  137. #
  138.  
  139. #if !empty(TM:Msun3)
  140. KERNELSTART    ?= 0x3fe0
  141. LINKSTART    ?= e4000
  142. #else
  143. #if !empty(TM:Msun4)
  144. KERNELSTART    ?= 0x4000
  145. LINKSTART    ?= $(KERNELSTART:S/0x/20/)
  146. #else
  147. #if !empty(TM:Mds3100) 
  148. KERNELSTART    ?= 0x80010000
  149. LINKSTART    ?= $(KERNELSTART:S/0x//)
  150. #else
  151. #if !empty(TM:Mds5000)
  152. KERNELSTART    ?= 0x80010000
  153. LINKSTART    ?= 80a00000
  154. #else
  155. #if !empty(TM:Msun4c)
  156. KERNELSTART    ?= 0x3fe0
  157. LINKSTART    ?= $(KERNELSTART:S/0x/20/)
  158. #else
  159. KERNELSTART    ?= 0x4000
  160. LINKSTART    ?= $(KERNELSTART:S/0x/b/)
  161. #endif
  162. #endif
  163. #endif
  164. #endif
  165. #endif
  166.  
  167. CFLAGS        += -DBOOT_CODE=0x$(LINKSTART) \
  168.         -DKERNEL_START=$(KERNELSTART) -DBOOTDIR=\"$(INSTALLDIR)\" \
  169.         -DSAIO_COMPAT -DBOOT_FILE=\"$(TM)\"
  170.  
  171.  
  172. #
  173. # The .INCLUDES variable already includes directories that should be
  174. # used by cc and other programs by default.  Remove them, just so that
  175. # the output looks cleaner.
  176.  
  177. CFLAGS        += $(.INCLUDES:S|^-I/sprite/lib/include$||g:S|^-I/sprite/lib/include/$(TM).md$||g)
  178.  
  179. #
  180. # Transformation rules: these have special features to place .o files
  181. # in md subdirectories, run preprocessor over .s files, etc.
  182. # There are no profile rules for boot programs because they aren't profiled.
  183. #
  184.  
  185. .c.o        :
  186.     $(RM) -f $(.TARGET)
  187.     $(CC) $(CFLAGS) -c $(.IMPSRC) -o $(.TARGET)
  188. .s.o    :
  189. #if empty(TM:Mds3100) && empty(TM:Mds5000)
  190.     $(CPP) $(CFLAGS:M-[IDU]*) -m$(TM) -D$(TM) -D_ASM $(.IMPSRC) > $(.PREFIX).pp
  191.     $(AS) -o $(.TARGET) $(AFLAGS) $(.PREFIX).pp
  192.     $(RM) -f $(.PREFIX).pp
  193. #else
  194.     $(RM) -f $(.TARGET)
  195.     $(AS) $(AFLAGS) $(.IMPSRC) -o $(.TARGET)
  196. #endif
  197.  
  198. #
  199. # The following targets are .USE rules for creating things.
  200. #
  201.  
  202. #
  203. # MAKEBOOT usage:
  204. #    <program> : <objects> <libraries> MAKEBOOT
  205. #
  206. # Similar to MAKECMD, except it doesn't create the version.[ho] files,
  207. # and the variable LINKSTART is used to define where the boot program
  208. # gets loaded.
  209. #
  210. MAKEBOOT    :  .USE -lc
  211.     rm -f $(.TARGET)
  212.     $(LD) -N -e start -T $(LINKSTART) $(CFLAGS:M-L*) $(LDFLAGS) \
  213.         -o $(.TARGET) $(.ALLSRC:N-lc:Nend.o) -lc $(.ALLSRC:Mend.o)
  214.  
  215. #
  216. # MAKEINSTALL usage:
  217. #    install :: <dependencies> MAKEINSTALL
  218. #
  219. # The program is installed in $(TMINSTALLDIR) and backed-up to
  220. # $(TMINSTALLDIR).old
  221. #
  222. #ifndef NOBACKUP
  223. BACKUP        = -b $(TMINSTALLDIR).old
  224. #ifdef BACKUPAGE
  225. BACKUP += -B $(BACKUPAGE)
  226. #endif
  227. #else
  228. BACKUP        =
  229. #endif  NOBACKUP
  230.  
  231. MAKEINSTALL    : .USE
  232.     ${RM} -f $(TMINSTALLDIR)/$(NAME)
  233.     ${INSTALL_PROG} $(TM).md/$(NAME) $(TMINSTALLDIR)/$(NAME)
  234.  
  235. #
  236. # MAKELINT usage:
  237. #    <fluff-file> : <sources to be linted> MAKELINT
  238. #
  239. # <fluff-file> is the place to store the output from the lint.
  240. #
  241. MAKELINT    : .USE
  242.     $(RM) -f $(.TARGET)
  243.     $(LINT) $(LINTFLAGS) $(CFLAGS:M-[IDU]*) $(.ALLSRC) > $(.TARGET) 2>&1
  244.  
  245. #
  246. # MAKEDEPEND usage:
  247. #    <dependency-file> : <sources> MAKEDEPEND
  248. #
  249. # Generate dependency file suitable for inclusion in future makes.
  250.  
  251. MAKEDEPEND    : .USE
  252.     @$(TOUCH) $(DEPFILE)
  253.     $(MAKEDEPEND) $(CFLAGS:M-[ID]*) -m $(TM) -w60 -f $(DEPFILE) $(.ALLSRC)
  254.     @$(MV) -f $(DEPFILE) $(DEPFILE).tmp
  255.     @$(SED) -e '/^#/!s|^.|$(TM).md/&|' <$(DEPFILE).tmp > $(DEPFILE)
  256.     @$(RM) -f $(DEPFILE).tmp
  257.  
  258. #if !defined(no_targets) && defined(NAME)
  259. #
  260. # We should define the main targets (make, make install, etc.).  See the
  261. # mkmf man page for details on what these do.
  262. #
  263. LIBS            ?=
  264.  
  265. #
  266. # start.o must come first
  267. default            : $(TM).md/$(NAME)
  268. $(TM).md/$(NAME)    : $(TM).md/start.o $(OBJS:S/$(TM).md\/start.o//:S/makeBoot.o//) MAKEBOOT
  269.  
  270.  
  271. clean            :: .NOEXPORT tidy 
  272.     $(RM) -f $(TM).md/$(NAME) 
  273.  
  274. tidy            :: .NOEXPORT 
  275.     $(RM) -f $(CLEANOBJS) $(CLEANOBJS:M*.o:S/.o$/.po/g) \
  276.             y.tab.c lex.yy.c core \
  277.         $(TM).md/lint \
  278.         a.out *~ $(TM).md/*~ version.h gmon.out mon.out
  279.  
  280. DEPFILE = $(TM).md/dependencies.mk
  281.  
  282. depend            : $(DEPFILE)
  283. $(DEPFILE)        ! $(SRCS:M*.c) $(SRCS:M*.s) $(SRCS:M*.cc) MAKEDEPEND
  284.  
  285.  
  286. #
  287. # For "install", a couple of tricks.  First, allow local.mk to disable
  288. # by setting no_install.  Second, use :: instead of : so that local.mk
  289. # can augment install with additional stuff.  Third, don't install if
  290. # TMINSTALLDIR isn't set.
  291. #
  292. #ifndef no_install
  293. #ifdef TMINSTALLDIR
  294. install            :: $(TM).md/$(NAME) installman MAKEINSTALL
  295. #else
  296. install            :: .SILENT
  297.     echo "Can't install $(NAME):  no install directory defined"
  298. #endif TMINSTALLDIR
  299. #endif no_install
  300.  
  301.  
  302. #if empty(MANPAGES)
  303. installman        :: .SILENT
  304.     echo "There's no man page for $(NAME).  Please write one."
  305. #elif !empty(MANPAGES:MNONE)
  306. installman        ::
  307.  
  308. #elif defined(INSTALLMAN)
  309. installman        :: .SILENT
  310.     $(UPDATE) -m 444 -l $(INSTALLMANFLAGS) $(MANPAGES) $(INSTALLMAN)
  311. #else
  312. installman        :: .SILENT
  313.     echo "Can't install man page(s): no install directory defined"
  314. #endif
  315.  
  316.  
  317. lint            : $(TM).md/lint
  318. $(TM).md/lint        : $(SRCS:M*.c) $(HDRS) $(LIBS:M-l*) MAKELINT
  319.  
  320.  
  321. mkmf            :: .SILENT
  322.     mkmf
  323.  
  324.  
  325. newtm            :: .SILENT
  326.     if $(TEST) -d $(TM).md; then
  327.         true
  328.     else
  329.         mkdir $(TM).md;
  330.         chmod 775 $(TM).md;
  331.         mkmf -m$(TM)
  332.     fi
  333.  
  334. #
  335. # No profiling for boot programs
  336. #
  337. #profile            : $(TM).md/$(NAME)$(PROFSUFFIX)
  338. #$(TM).md/$(NAME)$(PROFSUFFIX)    : $(OBJS:S/.o$/.po/g) $(LIBS:S/.a$/_p.a/g)
  339. #    $(RM) -f $(.TARGET)
  340. #    $(CC) $(CFLAGS) -pg -o $(.TARGET) $(.ALLSRC)
  341.  
  342.  
  343. tags            :: $(SRCS:M*.c) $(HDRS)
  344.     $(CTAGS) $(CTFLAGS) $(SRCS:M*.c)
  345.  
  346. #
  347. # No version header for boot programs
  348. #
  349. #version.h        :
  350. #    $(RM) -f version.h
  351. #    $(MKVERSION) > version.h
  352.  
  353. DISTOBJS    ?=
  354.  
  355. dist:
  356. #if defined(DISTDIR) && !empty(DISTDIR)
  357.     for i in Makefile local.mk $(TM).md/md.mk $(SRCS) $(HDRS) $(DISTOBJS)
  358.     do
  359.     if $(TEST) -e $${i}; then
  360.         $(UPDATE)  $${i} $(DISTDIR)/$${i} ;else true; fi
  361.     done
  362. #else
  363.     @echo "Sorry, no distribution directory defined"
  364. #endif
  365.  
  366. #include    <all.mk>
  367.  
  368. #endif no_targets && NAME
  369.  
  370. .MAKEFLAGS    : -C        # No compatibility needed
  371.  
  372. #include    <rdist.mk>
  373.